
/**
 * Content: Java自定义注解
 * --------------------------------------------------
 * Java自定义注解: https://blog.csdn.net/weixin_45020244/article/details/124087535
 */

import java.lang.annotation.*;
import java.lang.reflect.Method;

public class java_1300_Annotation {
    private String name;
    private String hobby;

    public String getName() {
        return name;
    }

    @Init("谢清照")
    public java_1300_Annotation setName(String name) {
        this.name = name;
        return this;
    }

    public String getHobby() {
        return name;
    }

    @Init("game")
    public java_1300_Annotation setHobby(String hobby) {
        this.hobby = hobby;
        return this;
    }

    public static void main(String[] args) {
        java_1300_Annotation user = UserFactory.create();
        user.setHobby("dance");
        System.out.println(user.getName());
        System.out.println(user.getHobby());
    }
}

// 注解解析器
class UserFactory {

    public static java_1300_Annotation create() {
        java_1300_Annotation user = new java_1300_Annotation();

        // 获取User类中所有的方法（getDeclaredMethods也行）
        Method[] methods = java_1300_Annotation.class.getMethods();

        try {
            for (Method method : methods) {
                // 如果一个注解指定注解类型是存在于此元素上此方法返回true，否则返回false
                //参数 -- 对应于注解类型的Class对象
                if (method.isAnnotationPresent(Init.class)) {

                    //此方法返回该元素的注解在此元素的指定注释类型（如果存在），否则返回null
                    Init init = method.getAnnotation(Init.class);
                    // 如果Method代表了一个方法 那么调用它的 invoke 就相当于执行了它代表的这个方法,在这里就是给set方法赋值
                    method.invoke(user, init.value());

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        return user;
    }
}

@Documented
@Inherited
@Target({ ElementType.FIELD, ElementType.METHOD ,ElementType.TYPE})  //可以在字段、枚举的常量、方法
@Retention(RetentionPolicy.RUNTIME)
@interface Init {
    String value() default "";
}